/***********************************************************
 * menu                       GCW 10/12/94                 *
 * m = menu(menuvector);                                   *
 * menuvector has the form                                 *
 * vector { title , vector { item , .... } }               *
 * where item =  vector {text$, valid$, flag }             *
 * flag has bit 0 set for a tick                           *
 ***********************************************************/

#ifndef _wimp_menu
#define _wimp_menu 1
#endif

menu(v)
{
 local @m, itembase, width, i, n, size, item, last;
 @m = @(newstring(28+24*(n=sizeof(item = v[1]))));
 for (width = i = 0; i < n; i++)
    if (width < (size = sizeof(item[i][0])))
        width = size;
 in @m put
 {
  pad(v[0]);  // title
  &70207;     // colours
  width;      // width of strings
  0;
 }
 for (i = 0, itembase = @m + 28; i < n; i++)
   menu_item(item[i],itembase + 24*i);
 last = itembase+24*n-24;
 putbyte(last,byte(last)|128);
 return @m;
}

pad(s)      // pad out to 12 bytes
{
 local t;
 t = s;
 while (sizeof(t) < 12)
     t += 0;
 return t;
}

menu_item(s,a)
{
 in a put
 {
   s[2];                                         // menu flag
   -1;                                           // no submenu
   1+(1<<4)+(1<<8)+(9<<12)+(1<<16)+(7<<24);      // icon flags
   @(s[0]);                                      // pointer to text
   @(s[1]);                        // pointer to validation string
   sizeof(s[0]);
 }
}

/* attach window handle to item in menu m */
attach_menu(m,item,handle)
{
 putword(m + 32 + 24*item,handle)
}
